package pers.cz.codegen.describe;


import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @program: jef-code-generator
 * @description: 描述java方法
 * @author: Cheng Zhi
 * @create: 2022-08-07 14:02
 **/
public class JavaMethod extends AbstractJavaElement {

    private Map<String, JavaMethodParamter> paramters = new LinkedHashMap<>();

    private IClass returnType;

    public JavaMethod(int modifiers, String methodName) {
        setModifer(modifiers);
        setName(methodName);
    }

    public JavaMethod(String methodName) {
        setName(methodName);
    }

    public IClass getReturnType() {
        return returnType;
    }

    public void setReturnType(IClass returnType) {

        this.returnType = returnType;
    }

    public void setReturnType(String type) {
        IClass simpleClass = new SimpleClass(type);
        setReturnType(simpleClass);
    }

    public void setReturnType(Class clazz) {
        IClass simpleClass = new SimpleClass(clazz);
        setReturnType(simpleClass);
    }

    /**
     * 添加一个参数
     * @param paramterName
     * @param javaMethodParamter
     */
    public void addParamter(String paramterName, JavaMethodParamter javaMethodParamter) {
        paramters.put(paramterName, javaMethodParamter);
    }

    /**
     * 生成方法代码
     * @return
     */
    @Override
    public String toCode() {

        StringBuilder sb = new StringBuilder();
        // 编程规范，方法开始要4个空格
        sb.append(TAB_SYMBOL);
        // 添加注释信息
        sb.append(getComment());
        // 换行
        sb.append(LINE_SYMBOL);
        // 缩进4个空格
        sb.append(TAB_SYMBOL);
        // 添加注解
        for (String annotation : annotations) {
            sb.append(annotation);
            // 换行
            sb.append(LINE_SYMBOL);
            // 缩进4个空格
            sb.append(TAB_SYMBOL);
        }
        // 方法描述符号
        sb.append(getModifer());
        // 方法返回类型
        if (returnType == null) {
            sb.append("void");
        } else {
            sb.append(returnType.getSimpleName());
        }
        // 空格
        sb.append(SPACE_SYMBOL);
        // 方法名称
        sb.append(getName());
        // 左括号
        sb.append("(");
        // 方法参数
        int counter = 0;
        int paramterCount = paramters.size();
        for (Map.Entry<String, JavaMethodParamter> entry : paramters.entrySet()) {

            counter ++;
            IClass paramterType = entry.getValue().getParamterType();
            sb.append(paramterType.getSimpleName());
            sb.append(" ");
            sb.append(entry.getKey());
            // 中间用逗号隔开
            if (counter != paramterCount) {
                sb.append(",");
                sb.append(SPACE_SYMBOL);
            }
        }
        // 右括号
        sb.append(")");
        // 空格
        sb.append("\t");
        // 方法开始大括号
        sb.append(START_SYMBOL);
        // 方法内容

        for (String content : getContents()) {
            sb.append(TAB_SYMBOL);
            sb.append(TAB_SYMBOL);
            sb.append(content);
            sb.append(LINE_SYMBOL);
        }
        sb.append(TAB_SYMBOL);
        // 方法结束大括号
        sb.append(END_SYMBOL);
        sb.append(LINE_SYMBOL);

        return sb.toString();
    }
}
